#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent):QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    Socket_Init();
    ui->IP->setText("115.29.109.104");
    ui->PORT->setText("6600");
    ui->IP->setEnabled(0);
    ui->PORT->setEnabled(0);
}

MainWindow::~MainWindow()
{
    delete ui;
}

/***************************************************************************
 * socket初始化
 ***************************************************************************/
void MainWindow::Socket_Init()
{
    //给客户端指针实例化空间
    socket = new QTcpSocket(this);

    //如果连接服务器成功，该客户端就会发射一个connected信号
    //我们可以将该信号连接到自定义的槽函数中处理相关逻辑
    //由于该连接只需要连接一次。所有在构造函数中即可
    connect(socket, &QTcpSocket::connected, this, &MainWindow::connected_slot);

    //客户端与服务器连接成功后，如果服务器向客户端发来数据，那么该客户端就会自动发射一个readyRead信号
    //我们可以将该信号连接到自定义槽函数中处理相关逻辑
    connect(socket, &QTcpSocket::readyRead, this, &MainWindow::readyRead_slot);

    //当客户端与服务器断开连接后，该客户端就会自动发射1一个disconnected信号
    //我们可以将该信号与自定义的槽函数连接
    //由于只需要连接一下，所有该连接写到构造函数即可
    connect(socket, &QTcpSocket::disconnected, this, &MainWindow::disconnected_slot);
}

//关于处理connected信号的槽函数
void MainWindow::connected_slot()
{
    ui->CONNECT->setText(tr("断开"));
    ComTextDisplay("连接服务器成功");
}

//disconn信号对应槽函数的实现
void MainWindow::disconnected_slot()
{
    ui->CONNECT->setText(tr("连接"));
    ComTextDisplay("断开服务器");
}

//关于readyRead信号对应槽函数的实现
void MainWindow::readyRead_slot()
{
    //读取该客户端中的数据
    //返回值：QBytearray
    socket->waitForReadyRead(100);
    QByteArray msg = socket->readAll();
    if(!msg.isEmpty())
    {
        SerialPort_RecDisplay(msg);
        QString str = msg;
        TCPProcess_Frame(str);
        msg.clear();
        str.clear();
    }
}


/***************************************************************************
 * tcp接收数据显示（string）
 ***************************************************************************/
void MainWindow:: SerialPort_RecDisplay(QByteArray data, const Qt::GlobalColor &color)
{
    QTextCharFormat format;
    QString log;
    QString StringData = data;

    format.setForeground(color);
    log = QDateTime::currentDateTime().toString("[hh:mm:ss]");
    log.append("IN << ");
    log.append(StringData);
    ui->ComDebugTextBrower->textCursor().insertText(log,format);
    ui->ComDebugTextBrower->moveCursor(QTextCursor::End);
}

/***************************************************************************
 * 系统日志显示
 ***************************************************************************/
void MainWindow::ComTextDisplay(QString qStr, const Qt::GlobalColor &color)
{
    QTextCharFormat format;
    QString log;

    format.setForeground(color);
    log = QDateTime::currentDateTime().toString("[hh:mm:ss]");
    log.append("SYS >> ");
    log.append(qStr);
    log.append("\r\n");

    ui->ComDebugTextBrower->textCursor().insertText(log,format);
    ui->ComDebugTextBrower->moveCursor(QTextCursor::End);
}

void MainWindow::on_CONNECT_clicked()
{

    if(ui->CONNECT->text() == tr("连接"))
    {
        QString hostName = ui->IP->text();  //获取主机地址
        quint16 port = ui->PORT->text().toUInt();     //获取端口号

        //调用函数连接到主机
        //函数原型：[virtual] void QAbstractSocket::connectToHost(const QString &hostName, quint16 port)
        //参数1：服务器的主机地址
        //参数2：端口号
        //返回值：无
        socket->connectToHost(hostName,port);
    }
    else if(ui->CONNECT->text() == tr("断开"))
    {
        socket->disconnectFromHost();
    }
}


void MainWindow::on_pushButton_clicked()
{
    ui->ComDebugTextBrower->clear();
}

///***************************************************************************
// * tcp接收数据处理
// ***************************************************************************/
void MainWindow::TCPProcess_Frame(QString str)
{
    if (str.contains("Data,", Qt::CaseSensitive))
    {
        QStringList list = str.split(",");
        QString sTemp = QString::number(list.at(1).toInt());
        sTemp.append("℃");
        ui->TEMP->setText(sTemp);
        QString sHumi = QString::number(list.at(2).toInt());
        sHumi.append("%");
        ui->HUMI->setText(sHumi);
    }
}

